﻿/**
 * Create in 2012-4-4.
 */
package kit4j.common.task;

import kit4j.common.task.event.ConcurrentTaskProgressRateChangeEventFirer;
import kit4j.common.task.event.TaskProgressRateChangeEvent;
import kit4j.common.task.event.TaskProgressRateChangeEventFirer;
import kit4j.common.task.event.TaskProgressRateChangeListener;

/**
 * 有任务进度值的任务的抽象类型。
 * 
 * @author MiniKnife
 * 
 */
public abstract class AbstractProgressionalTask extends AbstractTask implements ProgressionalTask {

	/**
	 * 任务进度变更事件发送器。
	 */
	private TaskProgressRateChangeEventFirer taskProgressRateChangeEventFirer;

	/**
	 * 创建一个抽象任务对象。
	 */
	public AbstractProgressionalTask() {
		taskProgressRateChangeEventFirer = new ConcurrentTaskProgressRateChangeEventFirer();
	}

	/**
	 * @see kit4j.common.task.ProgressionalTask#addTaskProgressRateChangeListener(kit4j.common.task.event.TaskProgressRateChangeListener)
	 */
	@Override
	public void addTaskProgressRateChangeListener(TaskProgressRateChangeListener listener) {
		taskProgressRateChangeEventFirer.addListener(listener);
	}

	/**
	 * @see kit4j.common.task.ProgressionalTask#removeTaskProgressRateChangeListener(kit4j.common.task.event.TaskProgressRateChangeListener)
	 */
	@Override
	public void removeTaskProgressRateChangeListener(TaskProgressRateChangeListener listener) {
		taskProgressRateChangeEventFirer.removeListener(listener);
	}

	/**
	 * @see kit4j.common.task.ProgressionalTask#getTaskProgressRateChangeListeners()
	 */
	@Override
	public TaskProgressRateChangeListener[] getTaskProgressRateChangeListeners() {
		return taskProgressRateChangeEventFirer.getListeners();
	}

	/**
	 * 报告任务进度的变化。
	 * 
	 * @param oldTaskProgressRate
	 *            任务之前的进度
	 * @param currentTaskProgressRate
	 *            任务当前的进度
	 */
	protected void fireTaskProgressRateChangeEvent(long oldTaskProgressRate, long currentTaskProgressRate) {
		taskProgressRateChangeEventFirer.fireEvent(new TaskProgressRateChangeEvent(this, oldTaskProgressRate,
				currentTaskProgressRate));
	}

}
